from django.shortcuts import render
from django.http import JsonResponse
import json
import jwt
import time
import hashlib
from . import models

# Create your views here.


def if_data(obj, num, info):
    """
    判断是否为空, 返回相应的信息

    :param obj: [传入对象]
    :type obj: [anj]
    :param num: [传入报的故障代码]
    :type num: [number]
    :param info: [传入报的故障信息]
    :type info: [str]
    :return: [json]
    :rtype: [JSON]
    """
    if not obj:
        return JsonResponse({'code': num, 'error': info})


def make_token(username, expire=3600*24):
    """
    使用jwt官方时辰token, 解决http无状态和保持登录等问题

    :param username: [用户名]
    :type username: [str]
    :param expire: [保持登录的时间], defaults to 3600*24
    :type expire: [单位秒], optional
    :return: [返回一个三段的字节串]
    :rtype: [str]
    """
    # 这里生成token用自定义的或者官方的jwt的都行
    key = '1235123'
    now = time.time()
    payload = {'username': username, 'exp': now+expire}
    return jwt.encode(payload=payload, key=key, algorithm='HS256')


def users(res):
    """
    用户注册
    """
    if res.method == 'GET':
        # 获取用户数据
        return JsonResponse({'code': 200})
    elif res.method == 'POST':
        # 创建用户 衔花信息科技
        # res.POST 只能拿表单数据, 其他数据一定在body里面
        json_str = res.body
        if_data(json_str, 201, '请给我你的数据')
        json_obj = json.loads(json_str)  # json 文本转字典

        # 这里不能直接用[]大括号取值,如果有意外会报错
        name = json_obj.get('username')
        if_data(name, 202, '账号为空!')

        email = json_obj.get('email')
        if_data(email, 203, '邮箱为空!')

        pwd1 = json_obj.get('password_1')
        if_data(pwd1, 204, '密码1为空!')
        pwd2 = json_obj.get('password_2')
        if_data(pwd2, 204, '密码2为空!')

        if pwd1 != pwd2:
            return JsonResponse({'code': 205, 'error': '两次密码不一致!'})

        # 优先查询当前用户是否以存在, 如果嫌get会抛异常需要处理异常,则用filter查询, filter返回的是一个集合,
        # 如何找到就在集合的第一个
        old_user = models.Users.objects.filter(uname=name)
        if old_user:
            return JsonResponse({'code': 206, 'error': '已有同名用户了!'})

        # 密码处理
        m = hashlib.md5()
        m.update(pwd2.encode())

        # 创建用户
        try:
            models.Users.objects.create(
                uname=name, nickname=name, email=email, pwd=m.hexdigest())
        except Exception as e:
            # 一般有三种情况抛异常, 一个是数据库链接断开,一个是数据库宕机,一个是用户名重名了
            return JsonResponse({'code': 207, 'error': '创建用户失败!'})

        # 创建tiken
        cs = make_token(name)
        print(cs)
        # 正常返回, 为什么是这个格式,可以协商,一般都是如此
        return JsonResponse({'code': 200, 'username': name, 'data': {'token': cs}})
    elif res.method == 'PUT':
        # 更新数据
        pass
    else:
        raise
    return JsonResponse({'code': 200})


def login(res):
    # 接收前端的数据

    # 效验密码

    # 生成token
    pass
